package main

import (
	"flag"
	"io/ioutil"
	"log"
	"os"
	ospath "path"
	"path/filepath"

	"github.com/ghodss/yaml"
)

var (
	jsonpath string
)

type FileInfo struct {
	Name string // 文件名
	// Size int64  // 文件大小
	Path string // 文件路径
}

func init() {
	log.SetFlags(log.Lshortfile | log.Ldate | log.Lmicroseconds)
	log.SetPrefix("++++ ")
	flag.StringVar(&jsonpath, "jp", ".", "json path")
	flag.Parse()
}

// GetFileList 递归获取指定目录下的所有文件
func GetFileList(path string, fileList *[]FileInfo) {
	files, _ := ioutil.ReadDir(path)
	for _, file := range files {
		if file.IsDir() {
			// GetFileList(path+file.Name()+`\`, fileList) // 递归调用
			GetFileList(filepath.Join(path, file.Name()), fileList)
		} else {
			filesuffix := ospath.Ext(file.Name())
			// log.Printf("suffix: %s", filesuffix)
			if filesuffix != ".json" {
				continue
			}

			*fileList = append(*fileList, FileInfo{
				Name: file.Name(),
				Path: filepath.Join(path, file.Name()),
			})
		}
	}
}

func convertJson2Yaml(fi *FileInfo) {
	buf, err := ioutil.ReadFile(fi.Path)
	if err != nil {
		log.Printf("warning!read json file error: %s", err)
		return
	}

	b2, err := yaml.JSONToYAML(buf)
	if err != nil {
		log.Printf("warning! convert json to yaml error: %v", err)
		return
	}
	// log.Printf("%s", b2)
	if err = ioutil.WriteFile(fi.Path+".yaml", b2, os.ModePerm); err != nil {
		log.Printf("warning! write yaml file error: %v", err)
	} else {
		log.Printf("write yaml file <%s> succ", fi.Path+".yaml")
	}
}

// func testJson2Yaml() {
// 	j := []byte(`{"name": "John", "age": 30}`)
// 	y, err := yaml.JSONToYAML(j)
// 	if err != nil {
// 		log.Printf("err: %v\n", err)
// 		return
// 	}
// 	// log.Println(string(y))
// 	log.Printf("yaml: %s", y)
// 	/* Output:
// 	name: John
// 	age: 30
// 	*/
// 	j2, err := yaml.YAMLToJSON(y)
// 	if err != nil {
// 		log.Printf("err: %v\n", err)
// 		return
// 	}
// 	log.Println(string(j2))
// }

func main() {
	fs := []FileInfo{}
	GetFileList(jsonpath, &fs)
	log.Printf("read all json file info: %v", fs)

	// testJson2Yaml()

	for _, v := range fs {
		convertJson2Yaml(&v)
	}
}
